package com.tiantian.listener;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import java.util.Date;

/**
 * Created by Administrator on 2016/7/28.
 * Jms事务：
 *
 * 在Spring整合JMS的应用中，如果我们要进行本地的事务管理的话非常简单，只需要在定义对应的消息监听容器时指定其sessionTransacted属性为true，如：
  默认JmsTransactionManager 来控制：
 该属性值默认为false，这样JMS在进行消息监听的时候就会进行事务控制，当在接收消息时监听器执行失败时JMS就会对接收到的消息进行回滚。
 滚，对于SessionAwareMessageListener在接收到消息后发送一个返回消息时也处于同一事务下，但是对于其他操作如数据库访问等将不属于该事务控制。
 这里我们可以来做一个这样的测试

 *
 *
 *    //这里建议不要try catch，让异常抛出，通过redeliveryPolicy去重试，达到重试次数进入死信DLQ(Dead Letter Queue)
 *
 */
public class ConsumerMessageListener implements MessageListener {
    @Override
    public void onMessage(Message message) {
        //这里建议不要try catch，让异常抛出，通过redeliveryPolicy去重试，达到重试次数进入死信DLQ(Dead Letter Queue)
        //这里我们知道生产者发送的就是一个纯文本消息，所以这里可以直接进行强制转换，或者直接把onMessage方法的参数改成Message的子类TextMessage
        TextMessage textMsg = (TextMessage) message;
        try {
            String txt = textMsg.getText();
            long start = System.currentTimeMillis();
            System.out.println("开始时间:"+start);
            System.out.println("接收消息内容benti：：" + message);
            System.out.println("接收消息内容是：：" + textMsg.getText());
            if("xiaocai".equals(txt)){
                System.out.println("我在尝试重试机制。");
                throw new RuntimeException("Error");
            }else if("xiaocai2".equals(txt)){
                System.out.println("我是第2个正常执行。");
            }
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}
